`timescale 1ns / 1ps
/////////////////////////////////////////////////////////////////////////////
////                                                                     ////
//// Instituto Tecnologico de Costa Rica                                 ////
////                                                                     ////
//// Controlador del tiempo                                              ////
////                                                                     ////
//// Este archivo es parte del proyecto: Control de luces de semaforo    ////
//// http://repositorio-charmander.googlecode.com/svn/trunk/             ////
////                                                                     ////
//// Descripcion                                                         ////
//// Implementacion de un control de luces de semaforo como un proyecto  ////
//// del curso de Taller de Diseño Logico.                               ////
////                                                                     ////
//// Funcionamiento:                                                     ////
//// - Este bloque se encarga de hacer la cuenta del tiempo en segundos  ////
////   para mandar la se;al y con esto lograr que la maquina cambie de   ////
////   estado segun el tiempo que asigno el usuario.                     ////
////                                                                     ////                                    
//// Autores:                                                            ////
//// - Gia Chen, kathya0812@gmail.com                                    ////
////   Edgar Rojas, edtec217@gmail.com                                   ////
////                                                                     ////
/////////////////////////////////////////////////////////////////////////////
module Timer(_clk_i, _sync_rst_i, HzActivado_i, value_i, start_timer_i, walk_i, expired_o, segmentos_o);

	input _clk_i, _sync_rst_i, HzActivado_i,walk_i;
	input start_timer_i;//Se;al que recibe de la maquina donde le indica que empiece a contar
	input [3:0] value_i;//Valor del tiempo en el que le indica hasta cuanto tiene que contar.
	output reg expired_o;//Salida del modulo que le indica a la FSM que termino de contar
	reg[3:0] counter;//Variable temporal que cuenta hasta llegar a ser igual que value_i.
	output reg[3:0] segmentos_o;//Salida que muestra el tiempo ext descontandose.
	
	//Cada vez que el clock haga una transicion al flanco positivo.
	always@(posedge _clk_i)
		begin
			if (_sync_rst_i)//Si se hace un reset se reinician los valores en 0.
				begin
					counter <= 0;
					expired_o <= 0;
				end
			else if (HzActivado_i)//Si la variable HzActivado_i esta en alto.
				begin
					if (start_timer_i)//Si la maquina indica que comience a contar
					begin
						if (counter == value_i)//Si el contador llega al tiempo que se le indico
							begin
								counter <= 0//Se inician las variables
								expired_o <= 1;
							end
						else
							begin 
								counter <= counter + 1;//Se aumenta el contador en una unidad
							end
					end
				end
			else if (start_timer_i)//En el caso de que HzActivado este en bajo se verifica si la maquina
				begin               //ha indicado que comience a contar.
					expired_o <= 0;//Variable que indica a la FSM que no ha terminado de contar.
				end
			else
				begin
					counter <= 0;//Se reinicia la variables
					expired_o <= 0;
				end
		end
		
		always@(posedge _clk_i)//Cada vez que el clk haga una transicion al flanco positivo
		begin
			if (walk_i==0)//Si se encuentra en el estado de paso peatonal
				segmentos_o <= value_i - counter;//Se comienza a descontar el tiempo 
			
			else
				segmentos_o <= 0;//Se reinicia la variable
		end
endmodule
